# monkey patch允许在运行期间动态修改一个类或模块（注意：python中一切皆对象，包括类、方法、甚至是模块）
class A:
    def func(self):
        print('hi')
    def monkey(self):
        print('hi,monkey')

#############################################
#! case-1
obj = A()
obj.func()               # 运行结果：hi

obj.func = obj.monkey    # 动态修改
obj.func()               # 运行结果：hi，monkey



#############################################
#! case-2
def other_monkey(a):
    print('hi,other monkey')


A.func= other_monkey
obj.func()               # 运行结果：hi，other monkey


#############################################
#! case-3
class B:
    def __init__(self):
        self.x = 3
        self.y = 'abcdef'
        
    def mul(self):
        return self.y * self.x
    
def power(self, n):
    return self.x ** n

B.power = power
obj     = B()
print(obj.power(3))   # 运行结果27



"""
参考文档

1. monkey patch: https://blog.csdn.net/Bankofli/article/details/105007329
2. monkey patch使用场景： 
"""

# 一个比较实用的例子，很多代码用到import json，后来发现ujson性能更高，如果觉得把每个文件的import json
# 改成import ujson as json成本较高，或者说想测试一下用ujson替换json是否符合预期，只需在入口加上：
import json
import ujson

def monkey_patch_json():
    json.__name__ = 'ujson'
    json.dumps = ujson.dumps
    json.loads = ujson.loads

monkey_patch_json()


#! 【注意事项】:  Monkey Patch需要提前运行